[MinIO]boto3で操作可能なS3互換ストレージをローカル上にDocker Composeで立てる方法

[MinIO]boto3で操作可能なS3互換ストレージをローカル上にDocker Composeで立てる方法

Clock Icon2022.10.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • AWSを利用しているとS3に格納しているデータをPython(boto3)で読み取り処理を行うケースは多いです。
  • 非常に便利な反面、お金や権限の問題で開発時の気軽な実行は躊躇ってしまいます。
  • 今回はboto3で操作可能なS3互換ストレージであるMinIOをローカル上にDocker Composeで立てる方法を記録いたします。

はじめに

  • 本記事では以下を行います。
    • MinIO環境の構築
    • MinIOクライアント(mc)環境の構築
    • boto3での動作確認
  • なおMinIOやMinIOクライアントの詳細な操作方法等は割愛いたします。

環境

  • mac OS Monterey 12.6
  • Docker 20.10.14
  • Docker Compose 2.4.1
  • Python 3.10.8

手順

MinIO環境の構築

  • まずファイル群を入れるためのディレクトリを任意で作成します。
mkdir ~/minio-sample
cd minio-sample
  • 次に必要となるディレクトリ及びファイルを作成します。
# コンテナ起動時に作成されるバケットに入れる初期データファイルを格納するディレクトリ
mkdir init_data

# コンテナ起動のための設定ファイル
touch docker-compose.yml
  • 作成後、以下の内容をdocker-compose.ymlに記述します。
version: '3.7'
services:
  minio:
    container_name: minio
    command: ['server', '/data', '--console-address', ':9001']
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=adminpass
    image: quay.io/minio/minio:latest
    ports:
      - '9000:9000'
      - '9001:9001'
    volumes:
      - ./minio_data:/data
    restart: unless-stopped
  mc:
    image: minio/mc
    container_name: mc
    depends_on:
      - minio
    environment:
      MINIO_ROOT_USER: "admin"
      MINIO_ROOT_PASSWORD: "adminpass"
    entrypoint: >
      /bin/sh -c "
      mc alias set myminio http://minio:9000 admin adminpass;
      mc mb myminio/sample;
      mc cp init_data/* myminio/sample;
      "
    volumes:
      - ./init_data:/init_data
  • 記述後、作成バケットに初期オブジェクトを流すためinit_dataディレクトリにデータファイルを追加いたします。
# init_dataディレクトリにfirst.csvとsecond.csvを追加
echo "id,name,score\n1,tod,100" > init_data/{first,second}.csv

# 中身を表示
cat init_data/first.csv

id,name,score
1,tod,100
  • 追加後、以下のコマンドでコンテナを起動します。
# 2つのコンテナが起動
docker compose up -d

# 起動確認
docker compose images

Container           Repository            Tag ****
mc                  minio/mc              latest ****
minio               quay.io/minio/minio   latest ****
  • 起動後、localhost:9000にアクセスしてMinIOのログイン画面が表示されることを確認します。

  • ログイン画面確認後、docker-compose.ymlで指定した以下の値でログインできることを確認します。
    • MINIO_ROOT_USER : admin
    • MINIO_ROOT_PASSWORD : adminpass

初期バケットやオブジェクトの確認

  • ログイン後、既に以下のバケットやオブジェクトが作成されていることを確認します。
    • バケット : sample
    • オブジェクト : first.csv,second.csv

  • 既に作成されている理由として、docker-compose.yml内で指定しているようにMinIOをコマンドラインで操作可能なmcが扱えるコンテナを立ち上げ、その起動時に「バケット作成やオブジェクト追加」のmcコマンドを自動実行しているからです。
    • MinIO環境のみの立ち上げであれば、バケットやオブジェクトは存在しません。

boto3での動作確認

  • バケットやオブジェクトの用意が完了したので、boto3がMinIOでもS3同様に利用可能か確かめていきます。
  • まず以下のコマンドをうち、Pythonファイルとモジュール格納用のディレクトリを作成して、そのディレクトリを指定する形でboto3をインストールします。
    • ※手軽に試すべく、仮想環境ではなくローカルディレクトリにモジュールを入れる形としています。
# 確認用ファイル作成
touch test.py

# Pythonモジュール格納用。
mkdir py-pkgs

# boto3を指定ディレクトリにインストール
python3 -m pip install boto3 -t py-pkgs
  • 作成後、以下の内容をtest.pyに記述します。
# モジュールディレクトリ指定
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'py-pkgs'))

import boto3

if __name__ == '__main__':
    s3 = boto3.resource(
        's3',
        endpoint_url='http://localhost:9000',
        aws_access_key_id='admin', # ログイン名
        aws_secret_access_key='adminpass', # ログインパスワード
    )

    # MinIOのバケット出力
    print('バケット一覧')
    for bucket in s3.buckets.all():
        print(bucket.name)
    print('')

    # MinIO内のfirst.csvの中身出力
    print('first.csvの中身')
    obj = s3.Object('sample','first.csv')
    res = obj.get()
    print(res['Body'].read().decode())
  • 記述後、ファイルを実行してバケット一覧やファイルの中身が正常に出力されることを確認します。
python3 test.py


バケット一覧
sample

first.csvの中身
id,name,score
1,tod,100
  • 以上です。

まとめ

  • MinIOを利用することでローカルでS3互換操作が可能なので非常に便利だと感じました。
  • 他にもモニタリング機能や通知機能などS3同様に機能が豊富にあるため、適宜利用を検討していきます。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.